home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / utils1 / fip09.arj / RESTORRB.ZIP / RESTORRB.C next >
C/C++ Source or Header  |  1994-01-11  |  6KB  |  225 lines

  1. /*
  2.     FIPS - the First nondestructive Interactive Partition Splitting program
  3.     Module restorrb.c
  4.  
  5.     Copyright (C) 1993 Arno Schaefer
  6.  
  7.     This program is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation; either version 1, or (at your option)
  10.     any later version.
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <io.h>
  24. #include <stdlib.h>
  25. #include <dos.h>
  26. #include <bios.h>
  27. #include <alloc.h>
  28. #include <conio.h>
  29. #include "types.h"
  30.  
  31. #define DISK_INT 0x13
  32.  
  33. #define RESET_DISK 0
  34. #define WRITE_SECTOR 3
  35. #define VERIFY_SECTOR 4
  36.  
  37. #define DISK1 0x80
  38.  
  39. /* ----------------------------------------------------------------------- */
  40. /* Copyright notice and version number                                     */
  41. /* ----------------------------------------------------------------------- */
  42.  
  43. void notice (void)
  44. {
  45.     printf ("\nFIPS version 0.9 beta, Copyright (C) 1993 Arno Schaefer\n");
  46.     printf ("Module RESTORRB.EXE - ");
  47.     printf ("Please read the file README.1ST\n");
  48.     printf ("FIPS comes with ABSOLUTELY NO WARRANTY, see file COPYING for details\n");
  49.     printf ("This is free software, and you are welcome to redistribute it\n");
  50.     printf ("under certain conditions; again see file COPYING for details.\n\n");
  51. }
  52.  
  53. /* ----------------------------------------------------------------------- */
  54. /* Error Handling                                                          */
  55. /* ----------------------------------------------------------------------- */
  56.  
  57. int getx (void)
  58. {
  59.     int character = getch();
  60.  
  61.     if (character == 3)
  62.     {
  63.         printf ("\n");
  64.         exit (0);
  65.     }
  66.     return (character);
  67. }
  68.  
  69. void error (char *message)
  70. {
  71.     fprintf (stderr,"\nError: %s!\n",message);
  72.     exit (-1);
  73. }
  74.  
  75. /* ----------------------------------------------------------------------- */
  76. /* BIOS calls                                                              */
  77. /* ----------------------------------------------------------------------- */
  78.  
  79. int reset_drives (void)
  80. {
  81.     union REGS regs;
  82.  
  83.     regs.h.ah = RESET_DISK;
  84.     regs.h.dl = DISK1;
  85.     int86 (DISK_INT,®s,®s);
  86.     if (regs.x.cflag) return (-1);
  87.     return 0;
  88. }
  89.  
  90. /* ----------------------------------------------------------------------- */
  91. /* read / write sectors                                                    */
  92. /* ----------------------------------------------------------------------- */
  93.  
  94. int verify_sector (int drive_number,dword head,dword cylinder,dword sector,byte *buffer)
  95. {
  96.     if (biosdisk (VERIFY_SECTOR,drive_number,head,cylinder,sector,1,buffer)) return (-1);
  97.     return 0;
  98. }
  99.  
  100. int write_sector (int drive_number,dword head,dword cylinder,dword sector,byte *buffer)
  101. {
  102.     int i;
  103.     boolean done=false;
  104.     for (i=0;i<3;i++)
  105.     {
  106.         if (!biosdisk (WRITE_SECTOR,drive_number,head,cylinder,sector,1,buffer))
  107.         {
  108.             done=true;
  109.             break;
  110.         }
  111.         reset_drives();
  112.     }
  113.     if (!done) return (-1);
  114.     return (verify_sector (drive_number,head,cylinder,sector,buffer));
  115. }
  116.  
  117. int write_root_sector (int drive_number,byte *buffer)
  118. {
  119.     return (write_sector (drive_number,0,0,1,buffer));
  120. }
  121.  
  122. /* ----------------------------------------------------------------------- */
  123. /* User Input                                                              */
  124. /* ----------------------------------------------------------------------- */
  125.  
  126. void ask_for_write_permission (void)
  127. {
  128.     int character = 'x';
  129.  
  130.     printf ("\nReady to write old root- and bootsector to disk\n");
  131.     printf ("Do you want to proceed (y/n): ");
  132.  
  133.     while ((character != 'y') && (character != 'n')) character = getx();
  134.     printf ("%c\n",character);
  135.     if (character == 'n') exit (0);
  136. }
  137.  
  138. /* ----------------------------------------------------------------------- */
  139. /* Main                                                                    */
  140. /* ----------------------------------------------------------------------- */
  141.  
  142. void main (void)
  143. {
  144.     byte rootsector[512];
  145.     byte bootsector[512];
  146.     int drive_number,partition_number,i;
  147.     FILE *handle;
  148.     dword head,cylinder,sector;
  149.     char *filename = "a:\\rootboot.000";
  150.     int no_of_savefiles = 0;
  151.     char first = 'x';
  152.  
  153.     notice();
  154.  
  155.     if (reset_drives ()) error ("Drive Initialization Failure");
  156.  
  157.     for (i='0';i<='9';i++)
  158.     {
  159.         filename[14] = i;
  160.         if (access (filename,0) == 0)
  161.         {
  162.             if (first == 'x') first = i;
  163.             no_of_savefiles++;
  164.             printf ("found savefile %s\n",filename);
  165.         }
  166.     }
  167.  
  168.     if (no_of_savefiles == 0) error ("No savefile ROOTBOOT.00? found on disk A:");
  169.  
  170.     if (no_of_savefiles > 1)
  171.     {
  172.         printf ("\nWhich file do you want to restore? ");
  173.         while (true)
  174.         {
  175.             int c;
  176.             if (isdigit (c = getx()))
  177.             {
  178.                 filename[14] = c;
  179.                 if (access (filename,0) == 0) break;
  180.             }
  181.         }
  182.     }
  183.     else
  184.     {
  185.         filename[14] = first;
  186.     }
  187.  
  188.     if (no_of_savefiles > 1)
  189.     {
  190.         printf ("%c\n", filename[14]);
  191.     }
  192.  
  193.     if ((handle = fopen (filename,"rb")) == NULL)
  194.         error ("Can't open file");
  195.  
  196.     for (i=0;i<512;i++)
  197.     {
  198.         int character = fgetc (handle);
  199.         if (character == EOF) error ("Error reading file from disk");
  200.         *(rootsector + i) = character;
  201.     }
  202.     for (i=0;i<512;i++)
  203.     {
  204.         int character = fgetc (handle);
  205.         if (character == EOF) error ("Error reading file from disk");
  206.         *(bootsector + i) = character;
  207.     }
  208.     if ((drive_number = fgetc (handle)) == EOF) error ("Error reading file from disk");
  209.     if ((partition_number = fgetc (handle)) == EOF) error ("Error reading file from disk");
  210.     if (fclose (handle)) error ("Error closing file");
  211.  
  212.     head = (dword) rootsector[0x1be+16*partition_number+1];
  213.     cylinder = (((dword) rootsector[0x1be+16*partition_number+2] << 2) & 0x300)
  214.         | (dword) rootsector[0x1be+16*partition_number+3];
  215.     sector = (dword) rootsector[0x1be+16*partition_number+2] & 0x3f;
  216.  
  217.     ask_for_write_permission();
  218.  
  219.     if (write_root_sector (drive_number,rootsector))
  220.         error ("Error writing rootsector");
  221.  
  222.     if (write_sector (drive_number,head,cylinder,sector,bootsector))
  223.         error ("Error writing bootsector");
  224. }
  225.